#!/bin/sh
##################
#the script is to convert the video to flv.
##convert.sh
#author:Ajian
#time:2008-01-03
#version:v1.0
#完成了最基本的转码流程。
#version:v1.1
#优化参数选项和补充日志记录功能
#version:v1.2
#添加Convert()函数，优化Shell内部命令，删除外部命令expr等。
#version:v1.3
#已经通过调试把大部分的问题解决，有待下一步更多视频的测试。
#version:V2.0
#加入截图函数
#version:v2.1
#更正一个错误，减少大量的参数。
#加入了最后输出结果以##==##为标志
#version:v2.2
#加入FlvTool2对文件信息的休复，保证文件的正常播放。
#version:v2.3
#加入转3GP的转码
#version:v3.0
#use by ziyuanguanli.
##################

#设置变量
 srcDir=""
# srcFile=/video/upload/avi1.avi
 tempDir=/video
 detDir=/video/upload
# detFile=2222
 logDir=/tmp/
 vCode=""
 ffmpegPath=/usr/bin/ffmpeg
 DEBUG=0	#debug flag: 1 to debug, 0 to cancel
 logoPic=/video/logo_01.png
 maxTime=120
 num=1
################
#相关函数
#function: usage()
#usage: How to use the shell script.
#return: 0
usage()
{
#usage
	echo "Usage :`basename $0` [-C videocode]||[-S sourcedir]||[-s sourcefile]||[-T tempDir]||[-D destinationDir]||[-d destinationFile]||[-t MaxTime]"
	echo "try `basename $0` -help for more info"
	exit 1
}

#function:manyfile()
#usage:convert copy videos in a Dir to tempDir and change the filename.
#manyfile()
#{
#find $1 -type f | while read file
#do
#echo -n "$file "
#md5sum "$file"|cut -d ' ' -f1|tr '\n' ' '
#echo "$file+`date`" | md5sum "$file"|cut -d ' ' -f1
#echo "$file+`date`" | sha1sum |cut -d ' ' -f1
#cp $file $2/$(echo "$file+`date`" | sha1sum |cut -d ' ' -f1)
#done >> $logfile
#}

#function:ffmpeg2flv()
#usage:How to use ffmpeg convert the video to flv .
#return:0
ffmpeg2flv()
{
#vTime=$1
minTime=120
#srcFile=$2
#detFile=$3
#logoPic=$5
#DEBUG=$4
#maxTime=$5
#quality=$7
SS=0
# if [[ $vTime -le $minTime ]]
#  then
#		write_log "$srcFile时长为$vTime,执行增强型的转换......" 
#	pic
#	convert 1
#	if [ $? -ne 0 ]
#                                       then
#                                                write_log  "ffmpeg 转码视频 $tempFile.flv 失败"
#						exit 1
#                                        else
#                                                write_log  "ffmpeg 转码视频 $tempFile.flv 成功" 
#                                       fi

#  elif [ $vTime -gt $minTime ] && [ $vTime -lt $maxTime ] 
  if [[ $vTime -le $maxTime ]] 
  then
	write_log "$srcFile时长为$vTime,执行压缩型的转换......"
	pic
	convert 2	
	if [ $? -ne 0 ]
                                       then
                                                write_log  "ffmpeg 转码视频 $tempFile.flv 失败"
						exit 1
                                        else
                                                write_log  "ffmpeg 转码视频 $tempFile.flv 成功" 
                                       fi

  elif [ $vTime -gt $maxTime ]
  then
	write_log "$srcFile时长为$vTime,对视频进行分割......"
	SS=0 
	num=0
	mmaxTime=$maxTime
		 while [[ $vTime -gt 0 ]]
		do
			(( num=$num+1))
			if [[ $(( $vTime - $mmaxTime )) -le $(( $mmaxTime / 3 )) ]] ##如果余下的视频时间少于最大时间的1/3就算到前一段中去。
			then
			{
			mmaxTime=$vTime
			}
			fi
			convert 5 
	 if [ $? -ne 0 ]
                                       then
                                                write_log  "ffmpeg 转码视频 $tempFile$num.flv 失败"
                                                exit 1
                                        else
                                                write_log  "ffmpeg 转码视频 $tempFile$num.flv 成功"
                                       fi
			vvTime[(( $num - 1 ))]=$mmaxTime
			SS=$(( $SS + $mmaxTime ))
			vTime=$(( $vTime - $mmaxTime ))
		done
			echo 0
			return 
		else
		echo "vTime出错了 不正确"
		exit 1
 fi
}

#function:convert()
#usage:How to convert the videos to flv and 3gp
#return 0
convert()
{
#srcFile=$2
#detFile=$3
#quality=$4
#maxTime=$4
#logoPic=$5
	case $1 in 
		1)
	##转增强型Flv
#	ffmpeg  -i $srcFile -vhook '/usr/lib/vhook/watermark.so -f /video/logo_01.png  -m 2 -t 000000 ' -y -f flv -ab 32 -ar 22050 -b 400000 -s 320*240 - | flvtool2 -U stdin  $tempFile.flv
	ffmpeg  -i $srcFile -y -f flv -ab 32 -ar 22050 -b 400000 -s 480*360 - | flvtool2 -U stdin  $tempFile.flv
#	ffmpeg -i $srcFile -b 64k -r 12.5 -s 176x144 -ab 12.2k -ar 8000 -ac 1 -y $tempFile.3gp
	return
	break
	;;
		2)
	##Ffmpeg转压缩型Flv
#	ffmpeg -i "$srcFile" -vhook '/usr/lib/vhook/watermark.so -f /video/logo_01.png -m 2 -t 000000' -y -f flv -ab 32 -r 12 -ar 22050 -ac 2 -b 300000 -s 320*240 - | flvtool2 -U stdin "$tempFile".flv
	ffmpeg -i "$srcFile"  -y -f flv -ab 32 -r 12 -ar 22050 -ac 2 -b 350000 -s 480*360 - | flvtool2 -U stdin "$tempFile".flv
#	ffmpeg -i $srcFile -b 64k -r 12.5 -s 176x144 -ab 12.2k -ar 8000 -ac 1 -y $tempFile.3gp
	return
	continue
	;;
		3)
	##Mencode转Avi 
	mencoder "$srcFile" -oac mp3lame -lameopts abr:br=56 -ovc xvid -xvidencopts bitrate=800 -of avi -o "$tempFile".avi 
	##1pass## mencoder -oac mp3lame -lameopts aq=7:mode=0:vol=1.2:vbr=2:q=6 -srate 32000  -ofps 15 -ovc xvid -xvidencopts fixed_quant=4 $srcFile -o $tempFile.avi
	return 
	continue
	;;
		4)
	##转Flv文件，保持原来的一些东西尽量不损失
#	ffmpeg  -i "$srcFile" -vhook '/usr/lib/vhook/watermark.so -f /video/logo_01.png  -m 2 -t 000000  ' -y -f flv -ab 32 -ar 22050 -b 400000 - | flvtool2 -U stdin  $tempFile.flv
	#cp -f $srcFile $tempFile.flv
	flvtool2 -Ux $srcFile $tempFile.flv
#	ffmpeg -i $srcFile -b 64k -r 12.5 -s 176x144 -ab 12.2k -ar 8000 -ac 1 -y $tempFile.3gp
	return 
	break
	;;
		5)
	##截段载Flv打水印
#		ffmpeg -y -f flv  -i $srcFile -vhook '/usr/lib/vhook/watermark.so -f /video/logo_01.png -m 2 -t 000000' -ss $SS -t $mmaxTime  -ab 56 -ar 22050 -qmin 2 -qmax 16 -b 320k -r 15 -s 320*240 - | flvtool2 -U stdin $tempFile$num.flv
		ffmpeg -y -f flv  -i $srcFile -ss $SS -t $mmaxTime  -ab 56 -ar 22050 -qmin 2 -qmax 16 -b 320k -r 15 -s 320*240 - | flvtool2 -U stdin $tempFile$num.flv
#	ffmpeg -i $srcFile -b 64k -r 12.5 -s 176x144 -ab 12.2k -ar 8000 -ac 1 -y $tempFile.3gp
	return 
	break
	;;
		*)
	write_log  "转码类型参数错误" 
	exit 1
	esac
}

#function:pic()
#usage:get the pictures from the videos
#return 0
pic()
{
N=1
vvTime=$(( $vTime  / 3 ))
	ffmpeg -i $srcFile -f image2 -ss $vvTime  -vframes 1 -y  $tempFile.jpg
	if [ $? -ne 0 ]
                                       then
                                                write_log  "ffmpeg failed to 截图$N video $srcFile "
                                                exit 1
                                                return
                                        else
                                                write_log  "ffmpeg 已经将$srcFile截图$N成功  "
						if [ -f $tempFile.jpg ]
						then
							ppic=$N
						fi
					return 0 
                                       fi


}

#function:write_log()
#usage:write the event to a logfile and according to the day time or the week to cut the logfile
#return 0
write_log()
{
if [ $DEBUG -ne 0 ]
then
echo "`date +%Y"-"%m"-"%d" "%k":"%M:"%S"`   $1 " | tee -a /tmp/$((`date +%Y%m%d`)).log
else
echo "`date +%Y"-"%m"-"%d" "%k":"%M:"%S"`   $1 " >> /tmp/$((`date +%Y%m%d`)).log
fi
}

###########################function end######################################
#
####################
##  Body 
####################
#判断是否有参数,有参数进行对应参数的赋值。并对赋值的正确性做判断
if [ $# -eq 0 ]
then
	usage
   else
while getopts C:S:s:T:t:D:d:B OPTION ; do
case $OPTION  in
	C)vCode="$OPTARG"       
		if [ $vCode == "unknown" ]
			then 
			vCode=""
		fi
		 echo $vCode    
		;;
	S)srcDir="$OPTARG"
       		 echo $srcDir
		if [ ! -d $srcDir ]; then
			echo "输入的源文件夹$srcDir不对"
			usage
		fi
		;;
	s)srcFile="$OPTARG"
		if [ ! -f $srcFile ]; then
			echo "输入的源文件$srcFile不对"
			usage
		fi
	        ;;
	T)tempDir="$OPTARG"
		 if [ ! -d $tempDir ]; then
                        echo "输入的转码文件夹$tempDir不对"
                        usage
                fi
        	;;
	t)maxTime="$OPTARG"
		;;
	D)detDir="$OPTARG"
		 if [ ! -d $detDir ]; then
                        echo "输入的目标文件夹$detDir不对"
                        usage
                fi
        	;;
	d)detFile="$OPTARG"
        	;;
	B)DEBUG=1
		;;
	*)usage
       		exit 1
		;;
        esac

done
fi

tempFile=$tempDir/$detFile

#判断源格式的编码
if [ -n "$vCode" ]
then 
	case $vCode in 
	flv)	
		write_log "$srcFile源格式为Flv，Flv按源格式输出打水印"
		vTime=`mplayer -identify "$srcFile" -nosound -vc dummy -vo null | grep ID_LENGTH | cut -d'=' -f2 | cut -d'.' -f1` 
		pic 
		convert 4
		 if [ $? -ne 0 ]
                                       then
                                                write_log  "ffmpeg 转码视频 $tempFile.flv 失败"
                                                exit 1
                                        else
                                                write_log  "ffmpeg 转码视频 $tempFile.flv 成功"
                                       fi
	 break
	 ;;
	*)
		write_log "$srcFile####调用ffmpeg函数来转码####"
		vTime=`mplayer -identify "$srcFile" -nosound -vc dummy -vo null | grep ID_LENGTH | cut -d'=' -f2 | cut -d'.' -f1` 
		pic
		convert 2
		#ffmpeg2flv
	 break
	 ;;
	esac
  else
		write_log "$srcFile###先调用mencode再调用ffmpeg转码####"
		convert 3
		 if [ $? -ne 0 ]
                                       then
                                                write_log  "ffmpeg 转码视频 $tempFile.avi 失败"
                                                exit 1
                                        else
                                                write_log  "ffmpeg 转码视频 $tempFile.avi 成功"
						srcFile="$tempFile".avi
					vTime=`mplayer -identify "$srcFile" -nosound -vc dummy -vo null | grep ID_LENGTH | cut -d'=' -f2 | cut -d'.' -f1` 
						pic
						convert 2
						#ffmpeg2flv
                                       fi

fi	
if [ $? -ne 0 ]
	then
	echo "转码流程有错误"
	exit 1
else
	echo "##==##"
	#for ((i=1;i<$num;i++))
	#do
	#	vTime[$i]=$maxTime
	#done
	#	vTime[$num]=$mmaxTime
	if [ $num -eq 1 ]
		then 
		 vvTime[0]=$vTime
	fi
	echo "pic=$ppic&num=$num&vTime=${vvTime[*]}"
fi
